package com.ranyk.www.support.page;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * CLASS_NAME: PageInfo.java <br/>
 *
 * @author ranyk           <br/>
 * @version V1.0           <br/>
 * @decription: 分页对象  <br/>
 * @date: 2022-04-01 <br/>
 */
@Data
@ApiModel(description = "分页对象")
public class PageInfo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1522419873665575369L;


    /**
     * 总记录
     */
    @JsonIgnore
    @ApiModelProperty(value = "总记录")
    private int total;
    /**
     * 总页数
     */
    @JsonIgnore
    @ApiModelProperty(value = "总页数")
    private int totalPage;
    /**
     * 数据库中limit的参数，从第几条开始取
     */
    @JsonIgnore
    @ApiModelProperty(value = "当前页面是第几条数据,默认为 0")
    private int offset;
    /**
     * 每页显示的记录数
     */
    @JsonIgnore
    @ApiModelProperty(value = "每页显示的数据量")
    private int limit;
    /**
     * 当前页
     */
    @JsonIgnore
    @ApiModelProperty(value = "当前所在页数,默认第一页")
    private int current;
    /**
     * 排序字段
     */
    @JsonIgnore
    @ApiModelProperty(value = "需要排序的字段名,多个字段用逗号分隔")
    private String sort;
    /**
     * ASC,DESC mybatis Order 关键字
     */
    @JsonIgnore
    @ApiModelProperty(value = "排序方式,升序 asc;降序 desc;")
    private String order;

    /**
     * 无参构造函数
     */
    public PageInfo() {
        super();
    }

    /**
     * 传入当前页码、显示数量构造分页对象
     *
     * @param limit   每页显示数量
     * @param current 当前页码
     */
    public PageInfo(int limit, int current) {
        // 计算当前页
        if (current <= 0) {
            this.current = 1;
        } else {
            // 当前页
            this.current = current;
        }
        // 记录每页显示的记录数
        this.limit = limit;
        // 计算开始的记录和结束的记录
        this.offset = (this.current - 1) * this.limit;
    }

    /**
     * 传入 当前页、每页显示数量、排序字段、升降序关键字构造分页对象
     *
     * @param current 当前页码
     * @param limit   每页显示数量
     * @param sort    排序字段
     * @param order   升序/降序关键字,ASC: 升序; DESC:降序;
     */
    public PageInfo(int current, int limit, String sort, String order) {
        // 计算当前页
        if (current <= 0) {
            this.current = 1;
        } else {
            // 当前页
            this.current = current;
        }
        // 记录每页显示的记录数
        this.limit = limit;
        // 计算开始的记录和结束的记录
        this.offset = (this.current - 1) * this.limit;
        // 排序字段，正序还是反序
        this.sort = sort;
        // 升序/降序关键字
        this.order = order;
    }

    /**
     * 计算总页数
     */
    public void count() {
        if (limit <= 0) {
            this.limit = 1;
        }
        // 计算总页数
        int totalPageTemp = this.total / this.limit;
        int plus = (this.total % this.limit) == 0 ? 0 : 1;
        totalPageTemp = totalPageTemp + plus;
        if (totalPageTemp <= 0) {
            totalPageTemp = 1;
        }
        this.totalPage = totalPageTemp;
    }


    /**
     * 计算当前页
     */
    @SuppressWarnings("unused")
    public void current() {
        if (limit <= 0) {
            this.limit = 1;
        }
        // 计算当前页数
        this.current = this.offset / this.limit + 1;
    }
}
